#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h> // file option
#include <dirent.h>
// #include <iostream>
// #include <sstream>
// #include <vector>
// #include <list>
// #include <map>
// #include <thread>
// #include <string>
// #include <iomanip>
// #include <fstream>
// #include <vector>
// #include <set>
// #include <algorithm>
// #include <unordered_map>
// #include <mutex>
// #include <atomic>
// #include <bits/wordsize.h>
// #include <bits/timesize.h>
using namespace std;

//文件操作：主要几个函数，FILE是c标准，可以跨平台。而linux的open，write,read,close有局限性
//fopen,fprintf,fscanf,fseek,ftell,fwrite,fread，fclose
//fopen打开标志解释。
// r
// 以只读方式打开文件，该文件必须存在。
// r+
// 以读/写方式打开文件，该文件必须存在。
// rb+
// 以读/写方式打开一个二进制文件，只允许读/写数据。
// rt+
// 以读/写方式打开一个文本文件，允许读和写。
// w
// 打开只写文件，若文件存在则文件长度清为零，即该文件内容会消失；若文件不存在则创建该文件。
// w+
// 打开可读/写文件，若文件存在则文件长度清为零，即该文件内容会消失；若文件不存在则创建该文件。
// a
// 以附加的方式打开只写文件。若文件不存在，则会创建该文件；如果文件存在，则写入的数据会被加到文件尾后，即文件原先的内容会被保留（EOF 符保留）。
// a+
// 以附加方式打开可读/写的文件。若文件不存在，则会创建该文件，如果文件存在，则写入的数据会被加到文件尾后，即文件原先的内容会被保留（EOF符不保留）。
// wb
// 以只写方式打开或新建一个二进制文件，只允许写数据。
// wb+
// 以读/写方式打开或新建一个二进制文件，允许读和写。
// wt+
// 以读/写方式打开或新建一个文本文件，允许读和写。
// at+
// 以读/写方式打开一个文本文件，允许读或在文本末追加数据。
// ab+
// 以读/写方式打开一个二进制文件，允许读或在文件末追加数据。
#define FILE_NAME_PATH "./myfile.txt"

int main()
{
    FILE *tmpf = NULL;
    char tmpbuf[1024];
    int tmplen;
    //time是linux读取当前时间的函数
    time_t tmptime = time(NULL);
    memset(tmpbuf, 0, sizeof(tmpbuf));
    tmpf = fopen(FILE_NAME_PATH, "r");
    if(tmpf == NULL)
    {
        printf("open err!\n");
    }
    else
    {
        //配置操作位置，到末尾。还有SEEK_SET到文件头。SEEK_CUR到当前位置。
        fseek(tmpf, 0, SEEK_END);
        tmplen = (int)ftell(tmpf);//获得操作位置的长度，这里就是文件总长度。
        //打印文件总长度。
        printf("file data len:%d\n", tmplen);
        //从头读取最大1024字节
        fseek(tmpf, 0, SEEK_SET);
        //每个单位为1字节，最大读取长度为sizeof(tmpbuf)
        tmplen = fread(tmpbuf, 1, sizeof(tmpbuf), tmpf);
        printf("read[%d]:%s\n", tmplen, tmpbuf);
        fclose(tmpf);
        tmpf = NULL;
    }

    tmpf = fopen(FILE_NAME_PATH, "wb+");
    if(tmpf == NULL)
    {
        printf("open err!\n");
    }
    else
    {
        //指定到头
        fseek(tmpf, 0, SEEK_SET);
        tmplen = snprintf(tmpbuf, sizeof(tmpbuf), "%ld:%d", tmptime, tmplen);
        printf("write[%d]:%s\n", tmplen, tmpbuf);
        //写入函数
        fwrite(tmpbuf, 1, strlen(tmpbuf), tmpf);
        fclose(tmpf);
    }


    return 0;
}